' Written by Craig'n'Dave
Module Module1
    ' Queue using objects
    Public Class Queue
        Private Class Node
            Public data As String
            Public pointer As Node
        End Class

        Private front_pointer As Node
        Private back_pointer As Node

        Function enqueue(item As String)
            ' Check queue overflow
            Try
                ' Enqueue the item
                Dim new_node As New Node
                new_node.data = item
                ' Empty queue
                If IsNothing(back_pointer) Then
                    front_pointer = new_node
                Else
                    back_pointer.pointer = new_node
                End If
                back_pointer = new_node
                Return True
            Catch
                Return False
            End Try
        End Function

        Function dequeue()
            ' Check queue underflow
            If Not IsNothing(front_pointer) Then
                ' Dequeue the item
                Dim item As String = front_pointer.data
                front_pointer = front_pointer.pointer
                ' When the last item is dequeued reset the pointers
                If IsNothing(front_pointer) Then
                    back_pointer = Nothing
                End If
                Return item
            Else
                Return Nothing
            End If
        End Function

        Function peek()
            ' Check queue underflow
            If Not IsNothing(front_pointer) Then
                'Peek the item
                Return front_pointer.data
            Else
                Return Nothing
            End If
        End Function
    End Class

    'Main program starts here
    Sub Main()
        Dim items() As String = {"Florida", "Georgia", "Delaware", "Alabama", "California"}
        Dim q As New Queue
        For index = 0 To items.Length - 1
            q.enqueue(items(index))
        Next
        Console.WriteLine(q.dequeue)
        Console.WriteLine(q.peek)
    End Sub

End Module